package cn.good.yan.m5;

import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 监听器 - 监听消息 - 验证仲裁队列 ，与基础版本一致，
 * 生产者 - 发送消息，消费者接受到，代表成功
 * 演示1：需要启动生产者（MyMessageListener）启动该服务、消费者（Test2）模拟发送消息
 * 生产者发送消息，消费者，这边监听会得到消息
 * 演示：一共有3台MQ - node主机
 * 当我们配置主节点是：Node01  、当改节点 宕机 -- rabbitmqctl stop_app
 * 在其他的Node02、Node03 正常方法，会在这里面重新选举 新的主节点 -  可以正常 发送消息 、 消费消息
 *
 * @author shengren.yan
 * @create 2024-06-10
 */
@Component
@Slf4j
public class Test2 {

    // 交换机
    public static final String EXCHANGE_DIRECT = "exchange.direct.queue";
    // 路由键
    public static final String ROUTING_KEY = "queue";
    // 队列
    public static final String QUEUE_NAME = "queue.test";

    /**
     * 方式1： 如果队列、交换机、绑定关系没有创建，可运行这里，会自动进行创建
     * bindings 绑定
     * QueueBinding 队列的绑定 、 durable ：是否持久化
     * exchange 指定交换机
     * key 指定的路由键 （字符串数组）
     *
     * @param dateString 消息数据的本身
     * @param message
     * @param channel
     */
//    @RabbitListener(bindings = @QueueBinding(value = @Queue(value = QUEUE_NAME, durable = "true"),
//            exchange = @Exchange(value = EXCHANGE_DIRECT),
//            key = {ROUTING_KEY}
//    ))
//    public void processMessage(String dateString, Message message, Channel channel) {
//        log.info("消费者接受到消息：" + dateString);
//    }

    // 方式2 ，如果已创建好队列、交换机、绑定关系，直接使用该注解就可以
    @RabbitListener(queues = QUEUE_NAME)
    public void processMessage2(String dateString, Message message, Channel channel) {
        log.info("2 消费者接受到消息：" + dateString);
    }

}
